home *** CD-ROM | disk | FTP | other *** search
- /* ------------- applicat.c ------------- */
-
- #include "dflat.h"
-
- static int ScreenHeight;
-
- extern DBOX Display;
- extern DBOX Windows;
-
- #ifdef INCLUDE_LOGGING
- extern DBOX Log;
- #endif
-
- #ifdef INCLUDE_SHELLDOS
- static void ShellDOS(WINDOW);
- #endif
- static void CreateMenu(WINDOW);
- static void CreateStatusBar(WINDOW);
- static void SelectColors(WINDOW);
- static void SetScreenHeight(int);
-
- #ifdef INCLUDE_WINDOWOPTIONS
- static void SelectTexture(void);
- static void SelectBorder(WINDOW);
- static void SelectTitle(WINDOW);
- static void SelectStatusBar(WINDOW);
- #endif
-
- static void SelectLines(WINDOW);
- static int DisplayModified;
-
- #ifdef INCLUDE_MULTI_WINDOWS
- static void CloseAll(WINDOW);
- static void MoreWindows(WINDOW);
- static void ChooseWindow(WINDOW, int);
- #endif
-
- int ApplicationProc(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- int rtn, WasVisible;
- static int AltDown = FALSE;
-
- switch (msg) {
- case CREATE_WINDOW:
- ScreenHeight = SCREENHEIGHT;
- if (!LoadConfig())
- cfg.ScreenLines = ScreenHeight;
- if (!isVGA() && !DisplayModified) {
- /* ---- modify Display Dialog Box for EGA, CGA ---- */
- CTLWINDOW *ct, *ct1;
- int i;
- ct = FindCommand(&Display, ID_OK, BUTTON);
- if (isEGA())
- ct1 = FindCommand(&Display, ID_50LINES, RADIOBUTTON);
- else {
- CTLWINDOW *ct2;
- ct2 = FindCommand(&Display, ID_COLOR, RADIOBUTTON) - 1;
- ct2->dwnd.w++;
- for (i = 0; i < 7; i++)
- (ct2+i)->dwnd.x += 8;
- ct1 = FindCommand(&Display, ID_25LINES, RADIOBUTTON) - 1;
- }
- for (i = 0; i < 4; i++)
- *ct1++ = *ct++;
- DisplayModified = TRUE;
- }
- #ifdef INCLUDE_WINDOWOPTIONS
- if (cfg.Border)
- SetCheckBox(&Display, ID_BORDER);
- if (cfg.Title)
- SetCheckBox(&Display, ID_TITLE);
- if (cfg.StatusBar)
- SetCheckBox(&Display, ID_STATUSBAR);
- if (cfg.Texture)
- SetCheckBox(&Display, ID_TEXTURE);
- #endif
- if (cfg.mono == 1)
- PushRadioButton(&Display, ID_MONO);
- else if (cfg.mono == 2)
- PushRadioButton(&Display, ID_REVERSE);
- else
- PushRadioButton(&Display, ID_COLOR);
- if (cfg.ScreenLines == 25)
- PushRadioButton(&Display, ID_25LINES);
- else if (cfg.ScreenLines == 43)
- PushRadioButton(&Display, ID_43LINES);
- else if (cfg.ScreenLines == 50)
- PushRadioButton(&Display, ID_50LINES);
- if (SCREENHEIGHT != cfg.ScreenLines) {
- SetScreenHeight(cfg.ScreenLines);
- if (WindowHeight(wnd) == ScreenHeight ||
- SCREENHEIGHT-1 < GetBottom(wnd)) {
- WindowHeight(wnd) = SCREENHEIGHT-1;
- GetBottom(wnd) = GetTop(wnd)+WindowHeight(wnd)-1;
- wnd->RestoredRC = WindowRect(wnd);
- }
- }
- SelectColors(wnd);
- #ifdef INCLUDE_WINDOWOPTIONS
- SelectBorder(wnd);
- SelectTitle(wnd);
- SelectStatusBar(wnd);
- #endif
- rtn = BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- if (wnd->extension != NULL)
- CreateMenu(wnd);
- CreateStatusBar(wnd);
- LoadHelpFile();
- SendMessage(NULL, SHOW_MOUSE, 0, 0);
- return rtn;
- case ADDSTATUS:
- if (wnd->StatusBar != NULL) {
- if (p1 && *(char *)p1)
- SendMessage(wnd->StatusBar, SETTEXT, p1, p2);
- else
- SendMessage(wnd->StatusBar, CLEARTEXT, 0, 0);
- SendMessage(wnd->StatusBar, PAINT, 0, 0);
- }
- return TRUE;
- case SETFOCUS:
- if ((int)p1 == (inFocus != wnd)) {
- /* ---- setting/clearing focus ------ */
- if ((int)p1)
- SendMessage(inFocus, SETFOCUS, FALSE, 0);
- /* remove window from list */
- RemoveFocusWindow(wnd);
- /* move window to end/beginning of list */
- p1 ? AppendFocusWindow(wnd) : PrependFocusWindow(wnd);
- inFocus = p1 ? wnd : NULL;
- SendMessage(wnd, BORDER, 0, 0);
- return TRUE;
- }
- break;
- case SIZE:
- WasVisible = isVisible(wnd);
- if (WasVisible)
- SendMessage(wnd, HIDE_WINDOW, 0, 0);
- if (p1-GetLeft(wnd) < 30)
- p1 = GetLeft(wnd) + 30;
- BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- CreateMenu(wnd);
- CreateStatusBar(wnd);
- if (WasVisible)
- SendMessage(wnd, SHOW_WINDOW, 0, 0);
- return TRUE;
- #ifdef INCLUDE_MINIMIZE
- case MINIMIZE:
- return TRUE;
- #endif
- case KEYBOARD:
- AltDown = FALSE;
- if (WindowMoving || WindowSizing)
- return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- switch ((int) p1) {
- case F1:
- return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- case ALT_F4:
- PostMessage(wnd, CLOSE_WINDOW, 0, 0);
- return TRUE;
- #ifdef INCLUDE_MULTI_WINDOWS
- case ALT_F6:
- SetNextFocus(inFocus);
- SkipSystemWindows(FALSE);
- return TRUE;
- #endif
- case ALT_HYPHEN:
- BuildSystemMenu(wnd);
- return TRUE;
- default:
- break;
- }
- PostMessage(wnd->MenuBarWnd, msg, p1, p2);
- return TRUE;
- case SHIFT_CHANGED:
- if ((int)p1 & ALTKEY)
- AltDown = TRUE;
- else if (AltDown) {
- AltDown = FALSE;
- SendMessage(wnd->MenuBarWnd, KEYBOARD,
- wnd->MenuBarWnd == inFocus ? ESC : F10, 0);
- }
- return TRUE;
- case PAINT:
- if (isVisible(wnd)) {
- #ifdef INCLUDE_WINDOWOPTIONS
- int cl = cfg.Texture ? APPLCHAR : ' ';
- #else
- int cl = APPLCHAR;
- #endif
- ClearWindow(wnd, (RECT *)p1, cl);
- }
- return TRUE;
- case COMMAND:
- switch ((int)p1) {
- case ID_HELP:
- DisplayHelp(wnd, DFlatApplication);
- break;
- case ID_HELPHELP:
- DisplayHelp(wnd, "HelpHelp");
- break;
- case ID_EXTHELP:
- DisplayHelp(wnd, "ExtHelp");
- break;
- case ID_KEYSHELP:
- DisplayHelp(wnd, "KeysHelp");
- break;
- case ID_HELPINDEX:
- DisplayHelp(wnd, "HelpIndex");
- break;
- #ifdef TESTING_DFLAT
- case ID_LOADHELP:
- LoadHelpFile();
- break;
- #endif
- #ifdef INCLUDE_LOGGING
- case ID_LOG:
- MessageLog(wnd);
- break;
- #endif
- #ifdef INCLUDE_SHELLDOS
- case ID_DOS:
- ShellDOS(wnd);
- return TRUE;
- #endif
- case ID_EXIT:
- case ID_SYSCLOSE:
- PostMessage(wnd, CLOSE_WINDOW, 0, 0);
- break;
- case ID_DISPLAY:
- if (DialogBox(wnd, &Display, TRUE, NULL)) {
- SendMessage(wnd, HIDE_WINDOW, 0, 0);
- SelectColors(wnd);
- SelectLines(wnd);
- #ifdef INCLUDE_WINDOWOPTIONS
- SelectBorder(wnd);
- SelectTitle(wnd);
- SelectStatusBar(wnd);
- SelectTexture();
- #endif
- CreateMenu(wnd);
- CreateStatusBar(wnd);
- SendMessage(wnd, SHOW_WINDOW, 0, 0);
- }
- break;
- case ID_SAVEOPTIONS:
- SaveConfig();
- break;
- #ifdef INCLUDE_MULTI_WINDOWS
- case ID_WINDOW:
- ChooseWindow(wnd, (int)p2-2);
- break;
- case ID_CLOSEALL:
- CloseAll(wnd);
- break;
- case ID_MOREWINDOWS:
- MoreWindows(wnd);
- break;
- #endif
- #ifdef INCLUDE_RESTORE
- case ID_SYSRESTORE:
- #endif
- case ID_SYSMOVE:
- case ID_SYSSIZE:
- #ifdef INCLUDE_MINIMIZE
- case ID_SYSMINIMIZE:
- #endif
- #ifdef INCLUDE_MAXIMIZE
- case ID_SYSMAXIMIZE:
- #endif
- return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- default:
- if (inFocus != wnd->MenuBarWnd && inFocus != wnd)
- PostMessage(inFocus, msg, p1, p2);
- break;
- }
- return TRUE;
- case CLOSE_WINDOW: {
- char exmsg[80];
- sprintf(exmsg, "Exit %s?", DFlatApplication);
- if (!YesNoBox(exmsg))
- return FALSE;
- #ifdef INCLUDE_MULTI_WINDOWS
- CloseAll(wnd);
- #endif
- PostMessage(NULL, STOP, 0, 0);
- rtn = BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- if (ScreenHeight != SCREENHEIGHT)
- SetScreenHeight(ScreenHeight);
- UnLoadHelpFile();
- SendMessage(NULL, HIDE_MOUSE, 0, 0);
- return rtn;
- }
- default:
- break;
- }
- return BaseWndProc(APPLICATION, wnd, msg, p1, p2);
- }
-
- #ifdef INCLUDE_SHELLDOS
- static void SwitchCursor(void)
- {
- SendMessage(NULL, SAVE_CURSOR, 0, 0);
- SwapCursorStack();
- SendMessage(NULL, RESTORE_CURSOR, 0, 0);
- }
-
- /* ------- Shell out to DOS ---------- */
- static void ShellDOS(WINDOW wnd)
- {
- SendMessage(wnd, HIDE_WINDOW, 0, 0);
- SwitchCursor();
- if (ScreenHeight != SCREENHEIGHT)
- SetScreenHeight(ScreenHeight);
- SendMessage(NULL, HIDE_MOUSE, 0, 0);
- printf("To return to %s, execute the DOS exit command.",
- DFlatApplication);
- spawnl(P_WAIT, getenv("COMSPEC"), NULL);
- if (SCREENHEIGHT != cfg.ScreenLines)
- SetScreenHeight(cfg.ScreenLines);
- SwitchCursor();
- SendMessage(wnd, SHOW_WINDOW, 0, 0);
- SendMessage(NULL, SHOW_MOUSE, 0, 0);
- }
- #endif
-
- static void CreateMenu(WINDOW wnd)
- {
- AddAttribute(wnd, HASMENUBAR);
- if (wnd->MenuBarWnd != NULL)
- SendMessage(wnd->MenuBarWnd, CLOSE_WINDOW, 0, 0);
- wnd->MenuBarWnd = CreateWindow(MENUBAR,
- NULL,
- GetClientLeft(wnd),
- GetClientTop(wnd)-1,
- 1,
- ClientWidth(wnd),
- NULL,
- wnd,
- NULL,
- 0);
- SendMessage(wnd->MenuBarWnd, BUILDMENU, (PARAM) wnd->extension, 0);
- AddAttribute(wnd->MenuBarWnd, VISIBLE);
- }
-
- static void CreateStatusBar(WINDOW wnd)
- {
- if (wnd->StatusBar != NULL) {
- SendMessage(wnd->StatusBar, CLOSE_WINDOW, 0, 0);
- wnd->StatusBar = NULL;
- }
- if (TestAttribute(wnd, HASSTATUSBAR)) {
- wnd->StatusBar = CreateWindow(STATUSBAR,
- NULL,
- GetClientLeft(wnd),
- GetBottom(wnd),
- 1,
- ClientWidth(wnd),
- NULL,
- wnd,
- NULL,
- SAVESELF);
- AddAttribute(wnd->StatusBar, VISIBLE);
- }
- }
-
- #ifdef INCLUDE_MULTI_WINDOWS
-
- static char *Menus[9] = {
- "~1. ",
- "~2. ",
- "~3. ",
- "~4. ",
- "~5. ",
- "~6. ",
- "~7. ",
- "~8. ",
- "~9. "
- };
-
- static int WindowSel;
-
- static char *WindowName(WINDOW wnd)
- {
- if (GetTitle(wnd) == NULL) {
- if (GetClass(wnd) == DIALOG)
- return ((DBOX *)(wnd->extension))->HelpName;
- else
- return "Untitled";
- }
- else
- return GetTitle(wnd);
- }
-
- static WINDOW oldFocus;
-
- void PrepWindowMenu(void *w, struct Menu *mnu)
- {
- WINDOW wnd = w;
- struct PopDown *p0 = mnu->Selections;
- struct PopDown *pd = mnu->Selections + 2;
- struct PopDown *ca = mnu->Selections + 13;
- int MenuNo = 0;
- WINDOW wnd1 = NULL;
- mnu->Selection = 0;
- oldFocus = NULL;
- if (GetClass(wnd) != APPLICATION) {
- oldFocus = wnd;
- wnd1 = Built.FirstWindow;
- while (wnd1 != NULL && MenuNo < 9) {
- if (GetClass(wnd1) != MENUBAR &&
- GetClass(wnd1) != STATUSBAR &&
- GetParent(wnd1) == GetParent(wnd)) {
- strncpy(Menus[MenuNo]+4, WindowName(wnd1), 20);
- pd->SelectionTitle = Menus[MenuNo];
- if (wnd1 == oldFocus) {
- pd->Attrib |= CHECKED;
- mnu->Selection = MenuNo+2;
- }
- else
- pd->Attrib &= ~CHECKED;
- pd++;
- MenuNo++;
- }
- wnd1 = NextWindowBuilt(wnd1);
- }
- }
- if (MenuNo)
- p0->SelectionTitle = "~Close all";
- else
- p0->SelectionTitle = NULL;
- if (wnd1 != NULL) {
- *pd++ = *ca;
- if (mnu->Selection == 0)
- mnu->Selection = 11;
- }
- pd->SelectionTitle = NULL;
- }
-
- static int WindowPrep(WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
- {
- switch (msg) {
- case INITIATE_DIALOG: {
- WINDOW wnd1 = Built.FirstWindow;
- WINDOW cwnd = ControlWindow(&Windows, ID_WINDOWLIST);
- int sel = 0;
- if (cwnd == NULL)
- return FALSE;
- while (wnd1 != NULL) {
- if (GetClass(wnd1) != MENUBAR &&
- GetClass(wnd1) != STATUSBAR &&
- GetParent(wnd1) == GetParent(wnd) &&
- wnd1 != wnd) {
- if (wnd1 == oldFocus)
- WindowSel = sel;
- SendMessage(cwnd, ADDTEXT, (PARAM) WindowName(wnd1), 0);
- sel++;
- }
- wnd1 = NextWindowBuilt(wnd1);
- }
- SendMessage(cwnd, LB_SETSELECTION, WindowSel, 0);
- AddAttribute(cwnd, VSCROLLBAR);
- PostMessage(cwnd, SHOW_WINDOW, 0, 0);
- break;
- }
- case COMMAND:
- switch ((int) p1) {
- case ID_OK:
- if ((int)p2 == 0)
- WindowSel = SendMessage(ControlWindow(&Windows,
- ID_WINDOWLIST),
- LB_CURRENTSELECTION, 0, 0);
- break;
- case ID_WINDOWLIST:
- if ((int) p2 == LB_CHOOSE)
- SendMessage(wnd, COMMAND, ID_OK, 0);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- return DefaultWndProc(wnd, msg, p1, p2);
- }
-
- static void MoreWindows(WINDOW wnd)
- {
- if (DialogBox(wnd, &Windows, TRUE, WindowPrep))
- ChooseWindow(wnd, WindowSel);
- }
-
- static void ChooseWindow(WINDOW wnd, int WindowNo)
- {
- WINDOW wnd1 = GetFirstChild(wnd);
- while (wnd1 != NULL) {
- if (GetClass(wnd1) != MENUBAR && GetClass(wnd1) != STATUSBAR)
- if (WindowNo-- == 0)
- break;
- wnd1 = GetNextChild(wnd, wnd1);
- }
- if (wnd1 != NULL) {
- SendMessage(wnd1, SETFOCUS, TRUE, 0);
- if (wnd1->condition == ISMINIMIZED)
- SendMessage(wnd1, RESTORE, 0, 0);
- }
- }
-
- static void CloseAll(WINDOW wnd)
- {
- WINDOW wnd1 = GetLastChild(wnd);
- SendMessage(wnd, SETFOCUS, TRUE, 0);
- while (wnd1 != NULL) {
- if (GetClass(wnd1) == MENUBAR || GetClass(wnd1) == STATUSBAR)
- wnd1 = GetPrevChild(wnd, wnd1);
- else {
- ClearVisible(wnd1);
- SendMessage(wnd1, CLOSE_WINDOW, 0, 0);
- wnd1 = GetLastChild(wnd);
- }
- }
- SendMessage(wnd, PAINT, 0, 0);
- }
-
- #endif /* #ifdef INCLUDE_MULTI_WINDOWS */
-
- static void DoWindowColors(WINDOW wnd)
- {
- WINDOW cwnd = Built.FirstWindow;
- InitWindowColors(wnd);
- while (cwnd != NULL) {
- InitWindowColors(cwnd);
- if (GetClass(cwnd) == TEXT && GetText(cwnd) != NULL)
- SendMessage(cwnd, CLEARTEXT, 0, 0);
- cwnd = NextWindowBuilt(cwnd);
- }
- }
-
- static void SelectColors(WINDOW wnd)
- {
- if (RadioButtonSetting(&Display, ID_MONO))
- cfg.mono = 1;
- else if (RadioButtonSetting(&Display, ID_REVERSE))
- cfg.mono = 2;
- else
- cfg.mono = 0;
- if ((ismono() || video_mode == 2) && cfg.mono == 0)
- cfg.mono = 1;
-
- if (cfg.mono == 1)
- memcpy(cfg.clr, bw, sizeof bw);
- else if (cfg.mono == 2)
- memcpy(cfg.clr, reverse, sizeof reverse);
- else
- memcpy(cfg.clr, color, sizeof color);
- DoWindowColors(wnd);
- }
-
- static void SelectLines(WINDOW wnd)
- {
- cfg.ScreenLines = 25;
- if (isEGA() || isVGA()) {
- if (RadioButtonSetting(&Display, ID_43LINES))
- cfg.ScreenLines = 43;
- else if (RadioButtonSetting(&Display, ID_50LINES))
- cfg.ScreenLines = 50;
- }
- if (SCREENHEIGHT != cfg.ScreenLines) {
- int FullScreen = WindowHeight(wnd) == SCREENHEIGHT;
- SetScreenHeight(cfg.ScreenLines);
- if (FullScreen || SCREENHEIGHT-1 < GetBottom(wnd))
- SendMessage(wnd, SIZE, (PARAM) GetRight(wnd),
- SCREENHEIGHT-1);
- }
- }
-
- static void SetScreenHeight(int height)
- {
- if (isEGA() || isVGA()) {
- SendMessage(NULL, SAVE_CURSOR, 0, 0);
- switch (height) {
- case 25:
- Set25();
- break;
- case 43:
- Set43();
- break;
- case 50:
- Set50();
- break;
- default:
- break;
- }
- SendMessage(NULL, RESTORE_CURSOR, 0, 0);
- SendMessage(NULL, RESET_MOUSE, 0, 0);
- SendMessage(NULL, SHOW_MOUSE, 0, 0);
- }
- }
-
- #ifdef INCLUDE_WINDOWOPTIONS
-
- static void SelectTexture(void)
- {
- cfg.Texture = CheckBoxSetting(&Display, ID_TEXTURE);
- }
-
- static void SelectBorder(WINDOW wnd)
- {
- cfg.Border = CheckBoxSetting(&Display, ID_BORDER);
- if (cfg.Border)
- AddAttribute(wnd, HASBORDER);
- else
- ClearAttribute(wnd, HASBORDER);
- }
-
- static void SelectStatusBar(WINDOW wnd)
- {
- cfg.StatusBar = CheckBoxSetting(&Display, ID_STATUSBAR);
- if (cfg.StatusBar)
- AddAttribute(wnd, HASSTATUSBAR);
- else
- ClearAttribute(wnd, HASSTATUSBAR);
- }
-
- static void SelectTitle(WINDOW wnd)
- {
- cfg.Title = CheckBoxSetting(&Display, ID_TITLE);
- if (cfg.Title)
- AddAttribute(wnd, HASTITLEBAR);
- else
- ClearAttribute(wnd, HASTITLEBAR);
- }
-
- #endif /* #ifdef INCLUDE_WINDOWOPTIONS */